#include "conexion.h"

int conexion_publish(conexion *c, int status, void *data, int size){
  c->callback(c, status, data, size);
}

int conexion_set_status(conexion *c, int status){
  c->status=status;
  conexion_publish(c, status, 0, 0);
}


int conexion_crear(conexion **c, conexion_callback callback){
  *c = malloc(sizeof(conexion));
  cola_crear(&((*c)->mensajes_salientes));
  cola_crear(&((*c)->mensajes_entrantes));
  (*c)->paquete_entrante=0;
  (*c)->paquete_saliente=0;
  (*c)->socket=0;
  (*c)->status=CON_DESCONECTADO;
  (*c)->callback = callback;
}

int conexion_destruir(conexion **c){
  //verificar desconectado
  cola_vaciar(&(*c)->mensajes_salientes);
  cola_vaciar(&(*c)->mensajes_entrantes);
  paquete_destruir(&(*c)->paquete_entrante); 
  paquete_destruir(&(*c)->paquete_saliente); 
  free(*c);
}

int conexion_enviar(conexion *c, void *datos, int size){
  cola_encolar(&c->mensajes_salientes, datos, size);
  conexion_publish(c, CON_DATOS_ENVIADOS, datos, size);
}

int conexion_procesar(conexion *c){
  conexion_procesar_conexion(c);
  conexion_procesar_envios(c);
  conexion_procesar_recepciones(c);
  while(cola_hay_datos(c->mensajes_entrantes)){
    void *datos;
    int size;
    cola_ver_primero(c->mensajes_entrantes, &datos, &size);
    conexion_publish(c, CON_DATOS_RECIBIDOS, datos, size);
    cola_desencolar(&c->mensajes_entrantes);
  }
} 

char* conexion_describir_status(int status){
  char *client_codes[]={"CONECTANDO", "DESCONECTANDO", "CONECTADO", "DESCONECTADO", "ERROR", "DATOS_ENVIADOS", "DATOS_RECIBIDOS", "NUEVA CONEXION", "ABIERTO", "CERRADO"};
  return client_codes[status];
}

